
/*
 * Este programa ordena una lista de numeros mediante el algoritmo de MergeSort.
 * Todo el procesamiento de este programa es realizado en forma secuencial.
 */

/* Inclusión de bibliotecas propias */
#include "../common/vectores.h"
#include "../common/entradasalida.h"
#include "../common/ordenamiento.h"

/* Inclusión de bicliotecas estandares */
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct VECTOR *ordenarVectorPorMergeSort(struct VECTOR *vector);

/* Sección de implementación de funciones */

int main(void) {

    // Imprimimos la bienvenida
    printf("====================================================================\n");
    printf("Ordenamiento de números mediante Merge Sort. VERSIÓN SECUENCIAL\n");
    printf("====================================================================\n");

    // Obtenemos la lista de elementos a ordenar y su tamaño.
    struct VECTOR *listaInicial = obtenerVectorDelUsuario();

    // En esta variable guardaremos el instante en que el cálculo comienza.
    time_t instanteInicial = time(NULL);
    
    // Llamamos a la función que realiza el ordenamiento mediante el algoritmo MergeSort
    printf("Ordenamos la lista\n");
    struct VECTOR *listaOrdenada = ordenarVectorPorMergeSort(listaInicial);

    eliminarVector(listaInicial); // Ya no necesitamos el vector original

    // Guardamos el momento final e imprimimos el tiempo de ejecucion.
    time_t instanteFinal = time(NULL);
    double tiempoEjecucion = difftime(instanteFinal,instanteInicial);
    printf("\nTiempo de ejecucion: %.0f segundos\n", tiempoEjecucion);

    // Guardamos la inversa calculada y terminamos el programa
    almacenarVector(listaOrdenada, "lista ordenada");
    eliminarVector(listaOrdenada);

    printf("\n====================================================================\n");
    printf("Fin del programa\n");
    printf("====================================================================\n\n");

    return (EXIT_SUCCESS);
    
}


/*
 * Invocación a la función recursiva de mergesort
 */
struct VECTOR *ordenarVectorPorMergeSort(struct VECTOR *vector) {

    // Obtenemos los parámetros necesarios para el cálculo
    int *lista = vector->elementos;
    int dimension = vector->dimension;

    // Llamamos a la funcion de ordenamiento
    int *listaOrdenada = mergesortRecursivo(lista, dimension);

    struct VECTOR *vectorOrdenado = crearVectorSinElementos(dimension);
    vectorOrdenado->elementos = listaOrdenada;

    return vectorOrdenado;

}
